home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / Raindrop.st < prev    next >
Text File  |  1993-07-24  |  5KB  |  220 lines

  1. "    NAME        Raindrop
  2.     AUTHOR        mdf@cs.man.ac.uk
  3.     FUNCTION impl of a popular Unix program 
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    Raindrop
  11.     is Michael's implementation of a popular UNIX program.(2.2). MDF
  12. "!
  13. 'From Smalltalk-80, version 2, of April 1, 1983 on 7 March 1987 at 5:48:18 pm'!
  14.  
  15. Object subclass: #Raindrop
  16.     instanceVariableNames: 'formbox ringdict ringsizes '
  17.     classVariableNames: ''
  18.     poolDictionaries: ''
  19.     category: 'Graphics-Games'!
  20.  
  21.  
  22. !Raindrop methodsFor: 'displaying'!
  23.  
  24. centre: aPoint delayedForMilliseconds: aDelay 
  25.     ^self
  26.         centre: aPoint
  27.         delayedForMilliseconds: aDelay
  28.         mask: #gray!
  29.  
  30. centre: aPoint delayedForMilliseconds: aDelay mask: aMask 
  31.     ringsizes do: 
  32.         [:size | 
  33.         (ringdict at: size)
  34.             displayOn: Display
  35.             at: aPoint - formbox center
  36.             clippingBox: Display boundingBox
  37.             rule: Form reverse
  38.             mask: (Form perform: aMask).
  39.         (Delay forMilliseconds: aDelay) wait.
  40.         (ringdict at: size)
  41.             displayOn: Display
  42.             at: aPoint - formbox center
  43.             clippingBox: Display boundingBox
  44.             rule: Form reverse
  45.             mask: (Form perform: aMask)]!
  46.  
  47. centre: aPoint delayedForSeconds: aDelay 
  48.     ^self
  49.         centre: aPoint
  50.         delayedForSeconds: aDelay
  51.         mask: #gray!
  52.  
  53. centre: aPoint delayedForSeconds: aDelay mask:aMask
  54.     ringsizes do: 
  55.         [:size | 
  56.         (ringdict at: size)
  57.             displayOn: Display
  58.             at: aPoint - formbox center
  59.             clippingBox: Display boundingBox
  60.             rule: Form reverse
  61.             mask: (Form perform: aMask).
  62.         (Delay forSeconds: aDelay) wait.
  63.         (ringdict at: size)
  64.             displayOn: Display
  65.             at: aPoint - formbox center
  66.             clippingBox: Display boundingBox
  67.             rule: Form reverse
  68.             mask: (Form perform: aMask) ]! !
  69.  
  70. !Raindrop methodsFor: 'private'!
  71.  
  72. formbox: aBox ringdict: aDict ringsizes: aCollection 
  73.     formbox _ aBox.
  74.     ringdict _ aDict.
  75.     ringsizes _ aCollection! !
  76. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  77.  
  78. Raindrop class
  79.     instanceVariableNames: ''!
  80. Raindrop class comment:
  81. 'This class is the class of all raindrops!!'!
  82.  
  83.  
  84. !Raindrop class methodsFor: 'instance creation'!
  85.  
  86. new: anIncrement maxExtent: maxRadius 
  87.     "define new raindrop with standard pen width and inner circle"
  88.  
  89.     ^self
  90.         new: anIncrement
  91.         maxExtent: maxRadius
  92.         penWidth: 2
  93.         minExtent: 10
  94.         mask: #gray!
  95.  
  96. new: anIncrement maxExtent: maxRadius penWidth: anInteger 
  97.     "define new raindrop with standard inner circle radius"
  98.  
  99.     ^self
  100.         new: anIncrement
  101.         maxExtent: maxRadius
  102.         penWidth: anInteger
  103.         minExtent: 10
  104.         mask: #gray!
  105.  
  106. new: anIncrement maxExtent: maxRadius penWidth: anInteger minExtent: minRadius 
  107.     "define new raindrop with standard inner circle radius"
  108.  
  109.     ^self
  110.         new: anIncrement
  111.         maxExtent: maxRadius
  112.         penWidth: anInteger
  113.         minExtent: minRadius
  114.         mask: #gray!
  115.  
  116. new: anIncrement maxExtent: maxRadius penWidth: anInteger minExtent: minRadius mask:aMask 
  117.     "define new raindrop"
  118.  
  119.     | radius circleForm rC rCForm ringdict ringsizes exPoint cPoint formbox |
  120.     ringdict _ Dictionary new.
  121.     ringsizes _ SortedCollection new.
  122.     rCForm _ Form new extent: anInteger @ anInteger.
  123.     rCForm perform: aMask.
  124.     radius _ minRadius.
  125.     rC _ Circle new.
  126.     rC form: rCForm.
  127.     cPoint _ Point new setX: maxRadius + 1 setY: maxRadius + 1.
  128.     exPoint _ Point new setX: 2 * maxRadius + 2 setY: 2 * maxRadius + 2.
  129.     rC center: cPoint.
  130.     [radius <= maxRadius]
  131.         whileTrue: 
  132.             [rC radius: radius.
  133.             circleForm _ Form new extent: exPoint.
  134.             rC displayOn: circleForm.
  135.             ringsizes addLast: radius.
  136.             ringdict at: radius put: circleForm.
  137.             radius _ radius + anIncrement].
  138.     formbox _ circleForm boundingBox.
  139.     ^self new
  140.         formbox: formbox
  141.         ringdict: ringdict
  142.         ringsizes: ringsizes! !
  143.  
  144. !Raindrop class methodsFor: 'examples'!
  145.  
  146. example
  147.     "Runs a rain example until a button is pressed (may even continue for 
  148.     a while after that!!)"
  149.  
  150.     | r exampleRain |
  151.     exampleRain _ Raindrop new: 50 maxExtent: 210.
  152.     r _ Random new.
  153.     [Sensor noButtonPressed]
  154.         whileTrue: 
  155.             [[exampleRain
  156.                 centre: r next * Display width @ (r next * Display height)
  157.                 delayedForSeconds: 0.2] fork.
  158.             (Delay forSeconds: 0.1) wait
  159.             ]
  160.  
  161.         "Raindrop example"!
  162.  
  163. example2
  164.     "Runs a rain example until a button is pressed"
  165.  
  166.     | r exampleRain |
  167.     exampleRain _ Raindrop
  168.                 new: 50
  169.                 maxExtent: 210
  170.                 penWidth: 4.
  171.     r _ Random new.
  172.     [Sensor noButtonPressed]
  173.         whileTrue: 
  174.             [[exampleRain centre: r next * Display width @ (r next * Display height) delayedForSeconds: 0.2 ] fork.
  175.             (Delay forSeconds: 0.1) wait
  176.             ]
  177.  
  178. "Raindrop example2"!
  179.  
  180. example3
  181.     "Runs a rain example until a button is pressed"
  182.  
  183.     | r exampleRain |
  184.     exampleRain _ Raindrop
  185.                 new: 30
  186.                 maxExtent: 210
  187.                 penWidth: 4
  188.                 minExtent: 15.
  189.     r _ Random new.
  190.     [Sensor noButtonPressed]
  191.         whileTrue: 
  192.             [[exampleRain centre: r next * Display width @ (r next * Display height) delayedForSeconds: 0.2] fork.
  193.             (Delay forSeconds: 0.1) wait
  194.             ]
  195.  
  196. "Raindrop example3"!
  197.  
  198. example4
  199.     "Runs a rain example until a button is pressed"
  200.  
  201.     | r exampleRain |
  202.     Display white.
  203.     Cursor blank showWhile: [
  204.         exampleRain _ Raindrop
  205.                     new: 20
  206.                     maxExtent: 180
  207.                     penWidth: 4
  208.                     minExtent: 15
  209.                     mask: #darkGray.
  210.         r _ Random new.
  211.         [Sensor noButtonPressed] whileTrue: 
  212.             [[exampleRain centre: r next * Display width @
  213.                 (r next * Display height) delayedForSeconds: 0.2] fork.
  214.             (Delay forSeconds: 0.1) wait
  215.             ].
  216.         (Delay forSeconds: 3) wait].
  217.     ScheduledControllers restore.
  218.  
  219. "Raindrop example4"! !
  220.